#ifndef QTMATERIALEVENTPOOL_H
#define QTMATERIALEVENTPOOL_H

#include <QObject>
#include <QList>
#include <QMutex>
#include <QPropertyAnimation>
#include <QGraphicsColorizeEffect>

class QtMaterialRipple;
class QtMaterialRippleOverlay;

/**
 * @brief [FDD-2025-03-021][API-007] QtMaterial 事件池
 * 复用动画和特效对象，避免频繁分配/释放导致的内存峰值
 */
class QtMaterialEventPool : public QObject
{
    Q_OBJECT

public:
    /**
     * @brief 获取单例
     */
    static QtMaterialEventPool& instance();

    /**
     * @brief 获取或创建 Ripple 对象
     * @param center Ripple 中心点
     * @param overlay 所属的 overlay（可为 nullptr）
     * @return 可复用的 Ripple 对象
     */
    QtMaterialRipple* acquireRipple(const QPoint& center, QtMaterialRippleOverlay* overlay = nullptr);

    /**
     * @brief 归还 Ripple 对象到池中
     * @param ripple 要归还的对象
     */
    void releaseRipple(QtMaterialRipple* ripple);

    /**
     * @brief 获取或创建 PropertyAnimation 对象
     * @param target 动画目标对象
     * @param propertyName 属性名称
     * @return 可复用的 PropertyAnimation 对象
     */
    QPropertyAnimation* acquirePropertyAnimation(QObject* target, const QByteArray& propertyName);

    /**
     * @brief 归还 PropertyAnimation 对象到池中
     * @param animation 要归还的对象
     */
    void releasePropertyAnimation(QPropertyAnimation* animation);

    /**
     * @brief 获取或创建 GraphicsColorizeEffect 对象
     * @return 可复用的 GraphicsColorizeEffect 对象
     */
    QGraphicsColorizeEffect* acquireColorizeEffect();

    /**
     * @brief 归还 GraphicsColorizeEffect 对象到池中
     * @param effect 要归还的对象
     */
    void releaseColorizeEffect(QGraphicsColorizeEffect* effect);

    /**
     * @brief 设置池大小上限
     * @param maxSize 最大对象数（最小10，默认50）
     * @return 实际生效值
     */
    int setMaxPoolSize(int maxSize);

    /**
     * @brief 获取池统计信息
     */
    struct PoolStats {
        int rippleCount;        // Ripple 池大小
        int animationCount;     // Animation 池大小
        int effectCount;        // Effect 池大小
        int totalAcquired;      // 总获取次数
        int totalReleased;      // 总归还次数
        int totalCreated;       // 总创建次数
        int maxPoolSize;        // 最大池大小
    };
    PoolStats getStats() const;

    /**
     * @brief 清空所有池（仅在必要时调用，如应用退出）
     */
    void clear();

private:
    QtMaterialEventPool(QObject* parent = nullptr);
    ~QtMaterialEventPool();
    Q_DISABLE_COPY(QtMaterialEventPool)

    // 重置 Ripple 对象状态
    void resetRipple(QtMaterialRipple* ripple);

    // 重置 PropertyAnimation 对象状态
    void resetPropertyAnimation(QPropertyAnimation* animation);

    // 重置 ColorizeEffect 对象状态
    void resetColorizeEffect(QGraphicsColorizeEffect* effect);

    mutable QMutex m_mutex;
    QList<QtMaterialRipple*> m_ripplePool;
    QList<QPropertyAnimation*> m_animationPool;
    QList<QGraphicsColorizeEffect*> m_effectPool;

    int m_maxPoolSize;
    int m_totalAcquired;
    int m_totalReleased;
    int m_totalCreated;
};

#endif // QTMATERIALEVENTPOOL_H
